﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using DAO;
using System.Net.Mail;
using System.Text;

namespace WEB
{
    public partial class fmInscricao : PaginaBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                onload();
            }
        }

        #region Objetos
        public class horarioTemp
        {
            public string numero { get; set; }
        }
        #endregion

        #region Funções
        public void onload()
        {
            try
            {
                List<string> keys = new List<string>(Request.QueryString.AllKeys);

                string eventoAlias;

                if (keys.Count > 0)
                {
                    eventoAlias = Request.QueryString[0];

                    Evento eventoEcontrado = EventoDAO.Selecionar(eventoAlias);

                    if (eventoEcontrado != null)
                    {
                        Session["evento"] = eventoEcontrado;

                        DepartamentoDAO.Listar(ddlDepartamento, eventoEcontrado.ID);
                        ddlDepartamento.Items.FindByText("- -").Text = "Todos";

                        CategoriaDAO.Listar(ddlCategoria, eventoEcontrado.ID);
                        ddlCategoria.Items.FindByValue("- -").Text = "Todos";
                    }
                    else
                    {
                        Response.Write("Evento não localizado!");
                    }
                }
            }
            catch (Exception ex)
            {
                Response.Write(ex.Message);
            }

            finally
            {
                mtv.SetActiveView(viewInicial);
            }
        }


        public void pesquisar()
        {
            try
            {
                int categoriaID = 0;
                int departamentoID = 0;

                if (ddlCategoria.SelectedIndex != 0)
                    categoriaID = int.Parse(ddlCategoria.SelectedValue);

                if (ddlDepartamento.SelectedIndex != 0)
                    departamentoID = int.Parse(ddlDepartamento.SelectedValue);


                Evento eventoEcontrado = (Evento)Session["evento"];

                var listagem = AtividadeDAO.Listar(eventoEcontrado.ID, departamentoID, categoriaID, 0, "");


                if (listagem.Count == 1)
                    lblNumeroLinhas.Text = "Foi encontrado " + listagem.Count + " registro.";
                else if (listagem.Count > 1)
                    lblNumeroLinhas.Text = "Foram encontrados " + listagem.Count + " registros.";
                else
                    lblNumeroLinhas.Text = "Nenhuma atividade foi localizada para este filtro!";


                var objs = (from a in listagem
                            join b in AtividadePessoaDAO.Listar(eventoEcontrado.ID, 0, 0) on a.ID equals b.atividadeID
                            where b.Papel.descricao.Contains("Autor")
                            select new
                            {
                                ID = a.ID,
                                Titulo = a.titulo,
                                Descricao = a.descricao,
                                preRequisitos = a.prerequisitos,
                                Departamento = a.Departamento.descricao,
                                Categoria = a.Categoria.descricao,
                                Autor = b.Pessoa.nomeCompleto,
                                totalVagas = a.totalVagas,
                                totalInscritos  =  a.AtividadePessoas.Select(g => g.eventoID == a.eventoID && g.atividadeID == a.ID).ToList().Count - 1,
                                totalDisponivel = a.totalVagas - (a.AtividadePessoas.Select(g => g.eventoID == a.eventoID && g.atividadeID == a.ID).ToList().Count - 1)
                            }).ToList();

                mtv.SetActiveView(viewInicial);

                rptAtividades.DataSource = objs;
                rptAtividades.DataBind();
            }
            catch (Exception ex)
            {
                lblErro.Text = ex.Message;
            }

            finally
            {
                mtv.SetActiveView(viewInicial);
            }
        }


        public void localizaPessoa()
        {
            try
            {
                Evento evento = (Evento)Session["evento"];
                Pessoa objRetornado = PessoaDAO.Selecionar(evento.ID, txtEmail.Text.Trim());

                if (objRetornado != null)
                {
                    txtNomeCompleto.Text = objRetornado.nomeCompleto;
                    txtNomeCompleto.ReadOnly = true;
                    txtNomeCompleto.Enabled = false;

                    txtTelefone.Text = objRetornado.telefone;
                    txtTelefone.ReadOnly = true;
                    txtTelefone.Enabled = false;
                    div_confirmarSenha.Visible = false;
                }
                else
                {
                    txtNomeCompleto.Text = string.Empty;
                    txtNomeCompleto.ReadOnly = false;
                    txtNomeCompleto.Enabled = true;

                    txtTelefone.Text = string.Empty;
                    txtTelefone.ReadOnly = false;
                    txtTelefone.Enabled = true;

                    div_confirmarSenha.Visible = true;
                }
            }
            catch (Exception)
            {
                throw;
            }
        }


        public void carregaAtividadeSelecionada(int id)
        {
            try
            {
                Evento evento = (Evento)Session["evento"];

                Atividade objRetornonado = AtividadeDAO.Selecionar(evento.ID, id);

                hfAtividadeID.Value = objRetornonado.ID.ToString();

                lblAtividadeSelecionada_Titulo.Text = objRetornonado.titulo;
                lblAtividadeSelecionada_PreRequisitos.Text = objRetornonado.prerequisitos;
                lblAtividadeSelecionada_Descricao.Text = objRetornonado.descricao;
                lblAtividadeSelecionada_Deparatamento.Text = objRetornonado.Departamento.descricao;
                lblAtividadeSelecionada_Categoria.Text = objRetornonado.Categoria.descricao;


                var objs = AtividadePessoaDAO.Listar(evento.ID, 0, objRetornonado.ID);

                lblAtividadeSelecionada_Autor.Text = objs.Where(e => e.Papel.descricao.Contains("Autor")).FirstOrDefault().Pessoa.nomeCompleto;

                mtv.SetActiveView(viewConfirmar);

            }
            catch (Exception)
            {
                throw;
            }
        }


        public void salvar()
        {
            lblErro.Text = string.Empty;
            lblSucesso.Text = string.Empty;

            try
            {
                Evento evento = (Evento)Session["evento"];

                Papel papel = PapelDAO.Selecionar(evento.ID, "Inscrito");

                Pessoa pessoa = new Pessoa();

                if (txtNomeCompleto.Enabled == true)
                {
                    if (txtConfirmarSenha.Text != txtSenha.Text)
                        throw new Exception("Senhas não conferem!");

                    pessoa.eventoID = evento.ID;
                    pessoa.papelID = papel.ID;
                    pessoa.nomeCompleto = txtNomeCompleto.Text.Trim();
                    pessoa.email = txtEmail.Text.Trim();
                    pessoa.telefone = txtTelefone.Text;
                    pessoa.senha = txtSenha.Text;

                    PessoaDAO.Salvar(pessoa);

                    montaEmailDeCadastro();
                }

                else
                {
                    pessoa = PessoaDAO.Selecionar(evento.ID, txtEmail.Text.Trim());

                    if(pessoa != null)
                    {
                        if (pessoa.senha != txtSenha.Text)
                            throw new Exception("E-mail e senha não conferem!");
                    }
                }


                AtividadePessoa obj = new AtividadePessoa();

                obj.eventoID = pessoa.eventoID;
                obj.atividadeID = int.Parse(hfAtividadeID.Value);
                obj.pessoaID = pessoa.ID;
                obj.papelID = papel.ID;

                AtividadePessoaDAO.Salvar(obj);

                lblSucesso.Text = "Registro salvo com sucesso!";


                lbl_MensagemSucesso.Text = "";
                mtv.SetActiveView(viewSucesso);

                montaEmailDeInscricao();

            }
            catch (Exception)
            {
                throw;
            }
        }


        public void EnviarEmail(string pRemetente, string pDestino, string pAssunto, string pCorpo)
        {
            MailMessage message = new MailMessage(pRemetente, pDestino, pAssunto, pCorpo);
            message.BodyEncoding = System.Text.Encoding.UTF8;


            message.IsBodyHtml = true; //Para mensagens com corpo em HTML - true. Para plain-text - false
            message.SubjectEncoding = System.Text.Encoding.UTF8;

            SmtpClient client = new SmtpClient("smtp.adosweb.com.br"); //IIS necessita está configurado - configure de acordo com as informações do provedor

            System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential("webmail@adosweb.com.br", "141516"); //Aqui você configura seu login e senha
            client.UseDefaultCredentials = false;
            client.Credentials = SMTPUserInfo;
            client.Port = 587; //Setar a porta que o provedor usa. Seguir orientações dele.
            client.EnableSsl = false; //Verificar se ele exige conexão SSL - se sim, true. Caso contrário, false.


            try
            {
                client.Send(message);
            }
            catch (System.Exception erro)
            {
                throw new Exception("Erro ao enviar e-mail.  O erro foi: " + erro.Message);
            }
        }

        public void montaEmailDeInscricao()
        {
            try
            {
                Evento evento = (Evento)Session["evento"];

                String Remetente = "webmail@adosweb.com.br";
                String Destino = txtEmail.Text;
                String Assunto = evento.titulo + " - Confirmação de Inscrição";

                StringBuilder sbCorpo = new StringBuilder();
                sbCorpo.Append("<h1>Confirmação de Inscrição - " + evento.titulo + "</h1>");

                sbCorpo.Append("Inscrição realizada em: " + DateTime.Now.Date.ToString("dd/MM/yyyy") + " às " + DateTime.Now.Hour + "h " + DateTime.Now.Minute + "min " + DateTime.Now.Second + "seg");

                sbCorpo.Append("<b><br /><br />" + evento.titulo + "<br /></b>");

                sbCorpo.Append("<b><br /><br />Dados da Atividade:<br /></b>");

                sbCorpo.Append("<b>Evento:</b> " + ((Evento)Session["evento"]).titulo);
                sbCorpo.Append("<br /><b>Departamento:</b> " + lblAtividadeSelecionada_Deparatamento.Text);
                sbCorpo.Append("<br /><b>Categoria:</b> " + lblAtividadeSelecionada_Categoria.Text);
                sbCorpo.Append("<br /><b>Título:</b> " + lblAtividadeSelecionada_Titulo.Text);
                sbCorpo.Append("<br /><b>Pré-Requisitos:</b> " + lblAtividadeSelecionada_PreRequisitos.Text);
                sbCorpo.Append("<br /><b>Descrição:</b> " + lblAtividadeSelecionada_Descricao.Text);
                sbCorpo.Append("<br /><b>Data:</b> " + "");
                sbCorpo.Append("<br /><b>Local:</b> " + "");

                String Corpo = sbCorpo.ToString();

                EnviarEmail(Remetente, Destino, Assunto, Corpo);

            }
            catch (Exception exe)
            {
                lblErro.Text = "Falha ao tentar enviar Mensagem. Por Favor tente novamente. <br /><br /> ERRO:<br />" + exe.Message.ToString();
            }

        }
        public void montaEmailDeCadastro()
        {
            try
            {
                Evento evento = (Evento)Session["evento"];

                String Remetente = "webmail@adosweb.com.br";
                String Destino = txtEmail.Text;
                String Assunto = evento.titulo + " - Confirmação de Cadastro";

                StringBuilder sbCorpo = new StringBuilder();
                sbCorpo.Append("<h1>Confirmação de Cadastro - " + evento.titulo + "</h1>");

                sbCorpo.Append("Inscrição realizada em: " + DateTime.Now.Date.ToString("dd/MM/yyyy") + " às " + DateTime.Now.Hour + "h " + DateTime.Now.Minute + "min " + DateTime.Now.Second + "seg");

                sbCorpo.Append("<b><br /><br />" + evento.titulo + "<br /></b>");

                sbCorpo.Append("<b><br /><br />Seus Dados:<br /></b>");

                sbCorpo.Append("<b>Nome:</b> " + txtNomeCompleto.Text);
                sbCorpo.Append("<br /><b>Email:</b> " + txtEmail.Text);
                sbCorpo.Append("<br /><b>Telefone:</b> " + txtTelefone.Text);
                sbCorpo.Append("<br /><b>Senha:</b> " + txtSenha.Text);

                sbCorpo.Append("<br /> <br />Importante! Clique <a href='www.adosweb.com.br/gead?" + evento.alias + "'> AQUI </a> e acesse a sua conta e fique atento as suas atividades dentro do evento!");
                String Corpo = sbCorpo.ToString();

                EnviarEmail(Remetente, Destino, Assunto, Corpo);

            }
            catch (Exception exe)
            {
                lblErro.Text = "Falha ao tentar enviar Mensagem. Por Favor tente novamente. <br /><br /> ERRO:<br />" + exe.Message.ToString();
            }

        }
        #endregion


        #region Eventos do formulario


        protected void txtEmail_OnTextChanged(object sender, EventArgs e)
        {
            try
            {
                localizaPessoa();
            }
            catch (Exception ex)
            {
                lblErro.Text = ex.Message;
            }
        }

        #region Grids

        #endregion

        #region Botões
        protected void btnPesquisar_Click(object sender, EventArgs e)
        {
            pesquisar();
        }

        protected void btnInscrever_Click(object sender, EventArgs e)
        {
            mtv.SetActiveView(viewConfirmar);
        }

        protected void btnConfirmarInscricao_Click(object sender, EventArgs e)
        {
            try
            {
                salvar();
            }
            catch (Exception ex)
            {
                lblErro.Text = ex.Message;
            }
        }

        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            mtv.SetActiveView(viewInicial);
        }

        #endregion

        protected void rptAtividades_ItemCommand(object source, RepeaterCommandEventArgs e)
        {
            try
            {
                if (e.CommandName.Contains("cmdSelecionaAtividade"))
                {
                    int id = Convert.ToInt32(e.CommandArgument);
                    carregaAtividadeSelecionada(id);
                }
            }
            catch (Exception ex)
            {
                lblErro.Text = ex.Message;
            }

        }

        #endregion
    }
}